<?php
/**
 * RedisQueen 进程
 * @name RedisQueenAction.class.php
 * @author Lilei
 */
namespace app\crontab\controller;

class Redis_queen extends CrontabCommon {
	/**
	 * 空队列休息时间
	 * @var int
	 */
	const QueenEmptySleep = 1;
	
	/**
	 * 一次处理的数量
	 * @var integer
	 */
	const FrequencyCount = 100;
	
	/**
	 * 初始化方法
	 */
	protected function _initialize()
	{
		//先执行父类初始化
		parent::_initialize();
	}
	
	/**
	 * 开始队列进程
	 * 
	 * @todo 需要采用无状态的分发执行, 否则就会有队列等待
	 * 使用Pcntl解决, 暂时把pcntl放在队列处理方法里, 放在这里好处是一个while一个主进程
	 * @todo 多个队列进程时需要加锁(在RedisQueen中)
	 */
	public function start() {
		$i = 1;
		// 实例化REDIS
		$RedisQueen = new RedisQueen();
		while ( $i<=self::FrequencyCount) {
			$i++;
			$size = $RedisQueen->GetQueenSize();
			if ( $size ) {
				//读取配置使用对应   php脚本  或  shell脚本模版
				CommonFun::get_other_config('CronConfig',2);
				$php_path = C("MODE_PHP");
				$CurrentDate = date("Y-m-d");
				@exec("nohup ".$php_path." /RedisQueen/runExec/times/{$i} ".ENV." 127.0.0.1 >> /data/wwwroot/c21daemon/log/RedisQueen.log 2> /dev/null &" );
			}else {
				sleep(self::QueenEmptySleep);
			}
		}
		
	}
	
	/**
	 * 执行队列数据命令
	 */
	public function runExec() {
		$i = I('get.times');
		$start_time = time();
		// 执行队列
		$RedisQueen = new RedisQueen();
		$RedisQueen->Run();
		
		$end_time = time();
		$cost_time = $end_time - $start_time;
		$echo= array();
		$echo[] = PHP_EOL;
		$echo[] = "-----Num:$i Start ".date("Y-m-d H:i:s", $start_time).PHP_EOL;
		$echo[] = "-----Num:$i CostTime:" . $cost_time . "s".PHP_EOL;
		$echo[] = "-----Num:$i Finished " . date("Y-m-d H:i:s", $end_time) . PHP_EOL;
		$echo[] = "-----Num:$i Execute Result:success".PHP_EOL;
		$echo[] = PHP_EOL;
		echo implode('', $echo);
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
?>